import type { InternalRowData, TableColumn } from 'naive-ui/es/data-table/src/interface'
import { ComponentEnum } from '@/enum/ComponentEnum'
import type { RendererElement, RendererNode } from 'vue'

import PeaceActionBtn from '@/components/type/PeaceActionBtn'
import PeaceOption from '@/components/type/PeaceOption.ts'
import PeaceRepeatRender from '@/components/type/PeaceRepeatRender'
import { DateTypeEnum } from '@/enum/DateTypeEnum'
import { PeaceForm } from '@/components/type/PeaceForm'

/**
 * n-data-table的所有列属性都已继承
 */
export type PeaceColumn<T = InternalRowData> = {
  // 内部使用
  [key: string]: unknown,
  // 内部使用(用于标记重复渲染组件,提交时合并到key或fileNames中)
  markFun: (peaceItem:PeaceColumn,columnIndex:number,numIndex:number) => any,
  // [可继承]指明渲染的组件类型
  componentEnum?: ComponentEnum
  // [可继承]指定option类型组件的option值或其它获取数据的方式
  optionConfig?: PeaceOption
  // 自定义渲染
  peaceRender?: (input: object) => VNode<RendererNode, RendererElement, { [key: string]: any }>
  // [可继承]是否参与过滤,覆盖未定义的filterConfig.filterable = peaceFilterable,默认true
  peaceFilterable?: boolean
  // [可继承]是否参与编辑(更新,添加,复制),覆盖未定义的saveConfig.peaceEditable = peaceEditable,默认true
  peaceEditable?: boolean
  // [可继承]是否参与新增,覆盖未定义的saveConfig.peaceAddable = peaceAddable,默认true
  peaceAddable?: boolean
  // [可继承]是否参与更新,覆盖未定义的saveConfig.peaceAddable = peaceAddable,默认true
  peaceUpdatable?: boolean
  // [可继承]是否参与复制,覆盖未定义的saveConfig.peaceCopyable = peaceCopyable,默认true
  peaceCopyable?: boolean
  // [可继承]是否参与详情,覆盖未定义的detailConfig.peaceDetailable = peaceDetailable,默认true
  peaceDetailable?: boolean
  // 筛选渲染配置
  filterConfig?: {
    // 如果 !!filterConfig === false,则该字段默认 true,反之默认 false,除非显示设置值
    autoExtend?: boolean
    // 未定义且autoExtend===true则继承外部的 key
    key?: string
    title?: string
    // 未定义且autoExtend===true则继承外部的 peaceFilterable
    peaceFilterable?: boolean
    // 未定义且autoExtend===true则继承外部的 optionConfig
    optionConfig?: PeaceOption
    // 未定义且autoExtend===true则继承外部的 componentEnum
    componentEnum?: ComponentEnum
    /** date组件type值,仅date使用,默认 date */
    dateType?: DateTypeEnum
    // 渲染个数以及保存格式等
    repeatRender?: PeaceRepeatRender
    // 自定义渲染
    peaceRender?: (input: object) => VNode<RendererNode, RendererElement, { [key: string]: any }>
  }
  //  详情渲染配置
  detailConfig?: {
    // 如果 !!detailConfig === false,则该字段默认 true,反之默认 false,除非显示设置值
    autoExtend?: boolean
    // 未定义且autoExtend===true,则继承外层peaceDetailable
    peaceDetailable?: boolean
    // 未定义且autoExtend===true则继承外部的key
    key?: string
    title?: string
    // 未定义且autoExtend===true则继承外部的 optionConfig
    optionConfig?: PeaceOption
    // 未定义且autoExtend===true则继承外部的 componentEnum
    componentEnum?: ComponentEnum
    // 自定义渲染
    peaceRender?: (input: object) => VNode<RendererNode, RendererElement, { [key: string]: any }>
  }
  // 保存渲染配置
  saveConfig?: {
    // 如果 !!saveConfig === false,则该字段默认 true,反之默认 false,除非显示设置值
    autoExtend?: boolean
    // 未定义且autoExtend===true则继承外部的key
    key?: string
    title?: string
    // 是否参与新增和更新以及复制,未定义且autoExtend===true则继承外部的 peaceEditable
    peaceEditable?: boolean
    // 不参与新增(不显示)
    peaceAddable?: boolean
    // 不参与更新(置空 && 不显示)
    peaceUpdatable?: boolean
    // 不参与复制(置空 && 不显示)
    peaceCopyable?: boolean
    // 默认true
    required?: boolean
    // 数字组件
    min?: number
    // 数字组件
    max?: number
    // 文本组件
    maxLength?: number
    /** date组件type值,仅date使用,默认 date */
    dateType?: DateTypeEnum
    // 表单校验
    validator?: (value: unknown) => boolean
    // 如果未设置，则使用外层 optionConfig
    optionConfig?: PeaceOption
    // 自定义渲染,用于新增和更新,复制, peaceEditRender < peaceAddRender,peaceUpdateRender
    peaceEditRender?: (input: object) => VNode<RendererNode, RendererElement, { [key: string]: any }>
    // 自定义渲染,用于新增
    peaceAddRender?: (input: object) => VNode<RendererNode, RendererElement, { [key: string]: any }>
    // 自定义渲染,用于修改
    peaceUpdateRender?: (input: object,) => VNode<RendererNode, RendererElement, { [key: string]: any }>
    // 自定义渲染,用于复制
    peaceCopyRender?: (input: object,) => VNode<RendererNode, RendererElement, { [key: string]: any }>
    // 渲染个数以及保存格式等
    repeatEditRender?: PeaceRepeatRender
    repeatAddRender?: PeaceRepeatRender
    repeatUpdateRender?: PeaceRepeatRender
    repeatCopyRender?: PeaceRepeatRender
  }
  /**新增,为空则使用saveConfig */
  addConfig?: PeaceForm
  /**更新,为空则使用saveConfig */
  updateConfig?: PeaceForm
  /**复制,为空则使用saveConfig */
  copyConfig?: PeaceForm
  // 行操作按钮
  rowBtnList?: PeaceActionBtn[]
} & TableColumn<T>
